<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>ECMA测试</title>
  </head>
  <body>
    <script>
      //  1.  Javascript 的数据类型有几种？分别又有哪些类型？（5）
      // 複雜數據類型和基礎數據類型
      // String Number Underfind Null Boolean  Symbol Object

      //  2.  return 有那两个作用？ 构造函数里return会怎么样？（5）
      //(1)  返回函數執行后的值,中斷函數的執行
      //(2) 在構造函數中，使用return可以返回一个對象
      //  3.  undefined 和 null 的区别？什么时候会得到undefined？（5）
      // undefined 是沒有定義的值
      // null是一個空的值
      //儅變量聲明但沒有初始化时，它的值就是 undefined
      //在函數内部沒有返回值时，也会返回 undefined

      //  4.  使用 continue 或 break 终止循环时，两种方式的区别是？（5）
      //continue 是跳過本次循環并進入到下一次循環
      //break 是完全終止循環并跳出循環躰，不再執行其餘的循環，也不再執行任何後續的語句

      //  5.  如何判断字符串内是否包含指定字符？（5）
      //使用indexOf方法判斷

      //  6. 值传递和引用传递的区别？ （5）

      //  7. 请尽量列举出数组的方法,并注明其作用以及会不会修改原数组，至少10种（10）
      //(1)會修改原數組
      //push,pop,unshift,shift,splice,sort
      //(2)不會修改原數組
      //slice,concat,join,indexOf,includes,some,every,map,filter,reduce
      //  8.  请写出以下输出的结果和原因；（10）
      var bar = true,
        number = 0;
      console.log(bar + 0); // 1  布爾值和數字進行求和運算時，布爾值會被轉換為數字，即'true'轉換為 1
      console.log(bar + 'xyz'); //truexyz  布爾值true轉換為字符串 'true'
      console.log(bar + true); //2   '1+1'
      console.log(+true); //1    '+1'
      console.log(!'bluej'); //false  '!為取反'
      console.log(number++); // 0  先返回 number 的值 0，載執行 number 自增操作，number 變爲 1
      console.log(++number); // 2  先執行 number 自增操作，number 變爲 2，再返回 number 的值 2
      console.log(number); // 2  經過上述操作 number 變成了2
      10 > 20 || console.log('haha'); // haha  邏輯或運算符 ,10>20 為false console.log('haha')為true ,返回haha
      10 > 20 && console.log('haha'); // false 邏輯與運算符 ,10>20 為false, 不再執行後面的代碼
      //  9. 将多个数组进合并后再去重；对于去重的方案要求3种及以上（10）
      //1
      var arr1 = [1, 2, 3],
        arr2 = [2, 3, 4, 5];
      var res = new Set([...arr1, ...arr2]);
      console.log(res);
      //2
      var arr1 = [1, 2, 3],
        arr2 = [2, 3, 4, 5];
      var res = arr1.concat(arr2).sort(function (a, b) {
        return a - b;
      });
      for (var i = 0; i < res.length; i++) {
        if (res[i] === res[i + 1]) {
          res.splice(i, 1);
          i--;
        }
      }
      console.log(res);

      //10.将 str="再见，还会再见吗燕子，再见的时候你要幸福好不好，燕子你要开心，你要幸福，好不好，开心啊，幸福！你的世界以后没有我了，没关系你要幸福，🚗~~ 🏃🏻~~燕子 🧎🏻燕子~~没有你我怎么活啊🚗~~ 🏃🏻~~燕子 🧎🏻燕子~~没有你我怎么活啊🚗~~ 🏃🏻~~燕子 🧎🏻燕子~~没有你我怎么活啊燕子，燕子，燕子，燕子，燕子，燕子，燕子你把我带走吧，燕子！"里面的所有"燕子"替换成"jack"不要用replaceAll(10)
      var str =
        '再见，还会再见吗燕子，再见的时候你要幸福好不好，燕子你要开心，你要幸福，好不好，开心啊，幸福！你的世界以后没有我了，没关系你要幸福，🚗~~ 🏃🏻~~燕子 🧎🏻燕子~~没有你我怎么活啊🚗~~ 🏃🏻~~燕子 🧎🏻燕子~~没有你我怎么活啊🚗~~ 🏃🏻~~燕子 🧎🏻燕子~~没有你我怎么活啊燕子，燕子，燕子，燕子，燕子，燕子，燕子你把我带走吧，燕子！';

      var arr = str.split('燕子');
      var newStr = arr.join('jack');
      console.log(newStr);

      //11. 找出数组中年龄小于18岁的女生(girl)的信息重新组成新的数组,并且将她们count变为现有的平方（10）
      var arr3 = [
        { name: '彭于晏', sex: 'boy', age: 18, count: 20 },
        { name: '迪丽热巴', sex: 'girl', age: 17, count: 30 },
        { name: '吴彦祖', sex: 'boy', age: 16, count: 40 },
        { name: '古力娜扎', sex: 'girl', age: 15, count: 50 },
        { name: '刘德华', sex: 'boy', age: 20, count: 60 },
        { name: '刘亦菲', sex: 'girl', age: 13, count: 70 },
        { name: '张学友', sex: 'boy', age: 14, count: 80 },
      ];
      var newArr1 = arr3
        .filter(function (item) {
          return item.sex === 'girl' && item.age < 18;
        })
        .map(function (item) {
          return {
            name: item.name,
            sex: item.sex,
            age: item.age,
            count: item.count ** 2,
          };
        });
      console.log(newArr1);
      // 12. 统计字符串'abbcccddddd'中每个字符出现的次数，统计数组['a','b','b','c','c','c','d','d','d','d','d'中每个字符出现的次数(10分)
      //1
      var str = 'abbcccddddd';
      var obj1 = str.split('').reduce(function (prev, item) {
        prev[item] = prev[item] + 1 || 1;
        return prev;
      }, {});
      console.log(obj1);
      //2
      var str2 = ['a', 'a', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'd', 'd', 'd'];
      var obj2 = str2.reduce(function (prev, item) {
        prev[item] = prev[item] + 1 || 1;
        return prev;
      }, {});
      console.log(obj2);
    </script>
  </body>
</html>
